package com.noble.glamour.module.logic.config;

import com.noble.glamour.module.logic.application.App;
import com.noble.library.base.bean.BaseData;
import com.noble.library.utils.FileUtil;

import org.json.JSONArray;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 个人资料通用配置
 */
public class InfoConfig extends BaseData {

    private static InfoConfig infoConfig;

    public synchronized static InfoConfig getInstance() {
        if (infoConfig == null) {
            infoConfig = new InfoConfig();
            infoConfig.parseJson(FileUtil.getFromAssets(App.getActivity(), "info_config.json"));
        }
        return infoConfig;
    }

    private SimpleConfig
            star,  //星座
            constellation;// 生日与星座关联配表

    @Override
    public void parseJson(String s) {
        JSONObject jsonObject = getJsonObject(s);

        star = new SimpleConfig();
        if (jsonObject.has("star")) star.parseJson(jsonObject.optString("star"));

        constellation = new SimpleConfig();
        if (jsonObject.has("constellation"))
            constellation.parseJson(jsonObject.optString("constellation"));
    }

    public SimpleConfig getConstellation() {
        return constellation;
    }

    /**
     * 移除数据源中的不限值
     *
     * @param simpleConfig 数据源
     * @return 移除不限之后的值
     */
    private SimpleConfig removeLimitIndex(SimpleConfig simpleConfig) {
        if (simpleConfig == null) return new SimpleConfig();

        //SubmitMap与其他集合同期添加，只判断SubmitMap即可
        if (simpleConfig.getSubmitMap() != null && simpleConfig.getSubmitMap().containsKey("不限")) {
            simpleConfig.getShow().remove(0);
            simpleConfig.getSubmit().remove(0);
            simpleConfig.getSubmitMap().remove("不限");
            simpleConfig.getShowMap().remove("0");
        }
        return simpleConfig;
    }

    /**
     * 单独配置解析
     */
    public class SimpleConfig extends BaseData {

        private List<String> show;
        private List<String> submit;
        private Map<String, String> submitMap;//提交数据的时候使用的map
        private Map<String, String> showMap;//服务器返回数据的时候展示使用

        public SimpleConfig() {
        }

        @Override
        public void parseJson(String s) {
            JSONObject jsonObject = getJsonObject(s);
            JSONArray showArray = jsonObject.optJSONArray("show");
            JSONArray submitArray = jsonObject.optJSONArray("submit");

            show = new ArrayList<>();
            submit = new ArrayList<>();
            submitMap = new HashMap<>();
            showMap = new HashMap<>();

            for (int i = 0; showArray != null && submitArray != null && i < showArray.length(); i++) {
                show.add(showArray.optString(i));
                submit.add(submitArray.optString(i));
                submitMap.put(showArray.optString(i), submitArray.optString(i));
                showMap.put(submitArray.optString(i), showArray.optString(i));
            }
        }

        public void setShow(List<String> show) {
            this.show = show;
        }

        public void setSubmit(List<String> submit) {
            this.submit = submit;
        }

        public void setSubmitMap(Map<String, String> submitMap) {
            this.submitMap = submitMap;
        }

        public void setShowMap(Map<String, String> showMap) {
            this.showMap = showMap;
        }

        public List<String> getShow() {
            return show;
        }

        public List<String> getSubmit() {
            return submit;
        }

        /**
         * 提交数据的时候使用，封装在提交数据的dialog中。外部用户无需关心
         *
         * @return 提交的key-value
         */
        public Map<String, String> getSubmitMap() {
            return submitMap;
        }

        /**
         * 显示数据的时候使用
         *
         * @return 以服务器返回的数据为key的map，可按照key获得显示的value
         */
        public Map<String, String> getShowMap() {
            return showMap;
        }

        /**
         * 根据数组中的index获取list的展示值
         *
         * @param index list中的index
         * @return 展示的value值
         */
        public String getStringWithIndex(int index) {
            return show == null || index < 0 || show.size() < index - 1 ? "" : show.get(index);
        }

        /**
         * 根据服务器返回的配置值获取展示的值
         *
         * @param value 服务器返回的配置值
         * @return 该配置项显示的内容
         */
        public String getShowWithSubmit(int value) {
            return showMap == null || !showMap.containsKey(String.valueOf(value)) ? "" : showMap.get(String.valueOf(value));
        }

        /**
         * 根据显示的值获取提交的值
         *
         * @param show 显示的值
         * @return 提交的integer值
         */
        public int getSubmitWithShow(String show) {
            return submitMap == null || !submitMap.containsKey(show) ? -1 : Integer.parseInt(submitMap.get(show));
        }
    }
}
